package com.hsurosy.hsuchain.nft.stream.producer;

import com.hsurosy.hsuchain.nft.stream.param.MessageBody;
import com.alibaba.fastjson.JSON;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.function.StreamBridge;
import org.springframework.messaging.support.MessageBuilder;

import java.util.UUID;

/**
 * 消息生产者类
 *
 * @Author Hsu琛君珩
 * @Date 2024-10-05 4:49
 * @Description
 * @Version: v1.0.0
 */
public class StreamProducer {

    /**
     * 日志记录器，用于记录发送消息的日志。
     */
    private static Logger logger = LoggerFactory.getLogger(StreamProducer.class);

    /**
     * StreamBridge 实例，用于通过 Spring Cloud Stream 发送消息。
     */
    @Autowired
    private StreamBridge streamBridge;

    /**
     * 发送消息
     * <p>
     * 该方法根据绑定名称、标签和消息内容发送消息。
     *
     * @param bingingName  绑定名称，指定消息的目的地。
     * @param tag          消息标签，用于标识消息的类别。
     * @param msg          消息内容。
     * @return boolean     返回消息是否发送成功。
     */
    public boolean send(String bingingName, String tag, String msg) {
        // 构建消息对象，设置幂等标识符和消息内容
        MessageBody message = new MessageBody()
                .setIdentifier(UUID.randomUUID().toString())
                .setBody(msg);

        // 记录发送的消息内容
        logger.info("send message : {} , {}", bingingName, JSON.toJSONString(message));

        // 通过 StreamBridge 发送消息，并设置消息头部的标签
        boolean result = streamBridge.send(bingingName,
                MessageBuilder.withPayload(message)
                        .setHeader("TAGS", tag)
                        .build());

        // 记录发送结果
        logger.info("send result : {} , {}", bingingName, result);

        return result;
    }

    /**
     * 发送消息，带有自定义头部信息
     * <p>
     * 该方法根据绑定名称、标签、消息内容以及自定义的头部信息发送消息。
     *
     * @param bingingName  绑定名称，指定消息的目的地。
     * @param tag          消息标签，用于标识消息的类别。
     * @param msg          消息内容。
     * @param headerKey    自定义头部的键。
     * @param headerValue  自定义头部的值。
     * @return boolean     返回消息是否发送成功。
     */
    public boolean send(String bingingName, String tag, String msg, String headerKey, String headerValue) {
        // 构建消息对象，设置幂等标识符和消息内容
        MessageBody message = new MessageBody()
                .setIdentifier(UUID.randomUUID().toString())
                .setBody(msg);

        // 记录发送的消息内容
        logger.info("send message : {} , {}", bingingName, JSON.toJSONString(message));

        // 通过 StreamBridge 发送消息，并设置消息头部的标签和自定义头部信息
        boolean result = streamBridge.send(bingingName,
                MessageBuilder.withPayload(message)
                        .setHeader("TAGS", tag)
                        .setHeader(headerKey, headerValue)
                        .build());

        // 记录发送结果
        logger.info("send result : {} , {}", bingingName, result);

        return result;
    }
}
